#include<iostream>//Kruscal 最小生成树算法
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct edge
{
    int from,to,weight;
}len[10010];
int g[101][101];
int f[101];//并查集
bool cmp(edge a,edge b)
{
    return a.weight<b.weight;
}
int sfind(int x)
{
    if(f[x]==x)return x;
    else return f[x]=sfind(f[x]);
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>len[i].from>>len[i].to>>len[i].weight;
    }
    sort(len+1,len+m+1,cmp);
    for(int i=1;i<=n;i++)f[i]=i;
    int cnt=0,ans=0;
    for(int i=1;i<=m;i++)
    {
        if(cnt==n-1)break;
        if(sfind(len[i].from)==sfind(len[i].to))continue;
        cnt++;
        f[sfind(len[i].from)]=sfind(len[i].to);
        ans+=len[i].weight;
    }
    cout<<ans<<endl;
    return 0;
}
/*
样例输入:
6 7
1 2 4
2 6 3
5 6 5
5 4 4
3 4 1
2 3 8
2 4 6
样例输出:
17
*/